《高性能網(wǎng)站建設(shè)進(jìn)階指南》閱讀筆記 2
發(fā)布時(shí)間:2013-11-22 瀏覽:377打印字號(hào):大中小
大部分Comet服務(wù)器或明顯地減少每個(gè)線程的資源開銷,或者使用微線程或進(jìn)程。如ErlyComet
大多數(shù)使用Comet的Php web應(yīng)用采用分離式(off-board),Php編寫的客戶端與使用另一門語言編寫的服務(wù)端通信。
工具包:Dojo Toolkit 或者 js.io
8.2 Transport Techniques
8.2.1 Polling
每x 毫秒發(fā)出一個(gè)請求,檢查是否有更新
setTimeout(function() {xhrRequest( {"foo" : "bar"})}, 2000);
function xhrRequest(data) {
var xhr = new XMLHttpRequest();
xhr.open("get", "http://localhost/foo.php", true);
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
//
}
};
xhr.send(null);
}
8.2.2 Long polling
Polling 可能會(huì)浪費(fèi)http請求,并且消耗寶貴的CPU時(shí)間和帶寬。即便數(shù)據(jù)更新間隔時(shí)間已知,polling可能會(huì)導(dǎo)致服務(wù)器端超負(fù)荷。服務(wù)器端還沒有響應(yīng)上一個(gè)數(shù)據(jù)請求,第2個(gè)或者第3個(gè)請求接踵而至,對服務(wù)器進(jìn)行狂轟亂炸。
Long polling: 服務(wù)器端只有在有可用的新數(shù)據(jù)時(shí)才響應(yīng),保持一個(gè)所有未響應(yīng)請求和它們對應(yīng)連接的大集合。服務(wù)端通過: Transfer-Encoding:chunked 或 Connection:close響應(yīng)來保持這些請求連接。
function longPoll(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange == function() {
if(xhr.readyState ==4) {
callback(xhr.responseText);
xhr.open('GET', url, true);
xhr.send(null);
}
}
xhr.open('POST', url, true);
xhr.send(null);
}
長連接的為您提:每臺(tái)Apache服務(wù)器大約可以處理10 000個(gè)并發(fā)連接,而一個(gè)運(yùn)行良好的Comet服務(wù)器應(yīng)該有能力處理超過50 000個(gè)并發(fā)長連接,這在處理實(shí)時(shí)應(yīng)用時(shí)是非??扇〉?。
8.2.3 Forever Frame
打開一個(gè)隱藏的Iframe,請求一個(gè)基于Http1.1 快編碼的文檔.
8.2.4 XHR Streaming
function xhrStreaming(url, callback) {
xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
var lastSize;
if(xhr.readyState > 2 ) {
newTextReceived = xhr.responseText.substring(lastSize);
lastSize = xhr.responseText.length;
callback(newTextReceived);
}
if(xhr.readyState == 4) {
xhrStreaming(url, callback);
}
8.2.5 websocket html5
8.3 Corss-Domain
Html5 postMessage
callback polling
JSONP polling
function callbackPolling(url, callback) {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = url + "callback=callbackPolling.callback");
callbackPolling.callback = function(data) {
callbackPolling(url, callback);
callback(data);
};
document.getElementsByTagName("head")[0].appendChild(script);
}
http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/ (八卦:麻球網(wǎng),被盛大收購)
http://ajaxian.com/archives/jsonp-json-with-padding
http://ajaxpatterns.org/On-Demand_Javascript
8.4.1 Manging connections
FreeBSD/OS X 的 Kqueue
Linux 的 epoll
Windows 的 completions ports
主流語言中一些網(wǎng)絡(luò)庫封裝成了一致且跨平臺(tái)的API
C的libevent java.nio, twisted python
性能優(yōu)化在不同情況下也大相徑庭,比如聊天程序,有許多連接,但在任何一個(gè)特定時(shí)間內(nèi)只有一小部分用戶在接收信息。通過服務(wù)器端的連接共享管理大量閑置連接是有好處的。http://orbited.org 和 willowchat.org 做了深入的優(yōu)化
實(shí)時(shí)股票報(bào)價(jià)監(jiān)控應(yīng)用程序,大量的連接不斷地更細(xì),很少有閑置連接的存在。Jetty/Lightstreamer/Liberator對這種情況作了優(yōu)化。
8.4.3 portocols
Comet的連接只允許server -> client 通信或雙向通信。
Bayeux Publish-Subscribe(pubsub)模型
隨著websocket的興起和處理百萬級(jí)用戶量的解決方案的出現(xiàn),其復(fù)雜性會(huì)逐漸降低。


